package com.xzk.ExpressInnWeb.dao;

import com.xzk.ExpressInnWeb.bean.Express;
import com.xzk.ExpressInnWeb.exception.DuplicateCodeException;

import java.util.List;
import java.util.Map;

/**
 * 根据api文档确定需要实现的方法
 */
public interface BaseExpressDao {
    
    /**
     * 用于查询数据库中的全部快递（总数+新增）
     * 待取件快递（总数+新增）
     * @return [{size:总数,day:新增},{size:总数,day:新增}] 返回的数据为包含两个Map集合的列表
     */
    List<Map<String,Integer>> consoleEx();

    /**
     * 用于查询所有快递
     * @param limit 是否分页的标记, true表示分页 (默认，前端传递参数为0或没有该参数), false表示查询所有快递
     * @param offset SQL语句查询的起始索引(跳过的记录行条数)
     * @param exSize 每一页查询的快递数量
     * @return 快递的集合
     */
    List<Express> findAllEx(boolean limit, int offset, int exSize);

    /**
     * 根据快递单号，查询快递信息
     * @param ex_num 单号
     * @return 查询到的快递信息，单号不存在时返回null
     */
    Express findExByExNum(String ex_num);

    /**
     * 根据快递取件码，查询快递信息
     * @param code 取件码
     * @return 查询到的快递信息，取件码不存在时返回null
     */
    Express findExByCode(String code);

    /**
     * 根据用户手机号，查询快递
     * 具体是要查询已取件、未取件还是所有快递
     * 由调用该方法的上层对象进行筛选
     * Dao只负责将所有查询到的快递信息返回到上层对象
     * @param userPhone 收件人的手机号码
     * @return 查询到的快递列表
     */
    List<Express> findAllExByUserPhone(String userPhone);

    /**
     * 根据录入人的手机号，查询快递
     * @param staffPhone 录入人的手机号
     * @return 查询到的快递列表
     */
    List<Express> findAllExByStaffPhone(String staffPhone);

    /**
     * 快递录入
     * @param ex 要录入的快递对象
     * @return 录入的结果，true表示成功，false表示失败
     */
    boolean insertEx(Express ex) throws DuplicateCodeException;

    /**
     * 修改快递
     * 若要修改手机号，则需要生成新的取件码，该操作不由DAO执行，故不在此方法内，
     * newEx不提取手机号，相应的SQL语句也不涉及手机号的update，
     * 修改手机号由Service处理
     *
     * 若newEx.getStatus()为1，则需要修改取件状态为已取件；此时还需要调用updateExStatus方法
     * 进行出库时间设置和取件码置空的操作
     *
     * @param id 要修改信息的快递的id
     * @param newEx 新的快递对象 (ex_num, username, company, status)
     * @return 修改的结果，true表示成功，false表示失败
     */
    boolean updateEx(int id, Express newEx);

    /**
     * 确认取件
     * 实际上是更改了快递对象的status属性
     * 更改status为1，表示取件完成
     * 另外还需要设定出库时间并且将取件码置空
     *
     * @param code 确认取件的取件码
     * @return 确认取件操作的结果，true表示成功，false表示失败
     */
    boolean updateExStatus(String code);

    /**
     * 根据id，删除单个快递信息
     * @param id 要删除信息的快递id
     * @return 删除的结果，true为成功，false为失败
     */
    boolean deleteEx(int id);

    /**
     * 返回懒人排行榜的数据
     *
     * @param code 0-总 1-年 2-月
     * @return 总/年/月 的快递数最多的用户名和快递数量的集合
     */
    List<Map> getLazyBoardValues(int code);

}
